//================== Pile de containers (par ex. CadreFenetre) =================
__baseZIndexFenetres = 1;

function PileFenFille(fen){
//traceAct('PileFenFille constructeur ctrleur/fen ',fen.id)

//--- identification de l'objet composite; base de l'identification de ses parties
var nvId = (PileFenFille.prototype.nbInstance++);
this.id = "ctrlFenFi_" + nvId;
this.idObjComp = nvId;
//traceAct('cr?ation ctrl id=  ',this.id);
     if (fen.typeContainer == 'CadreFenetre'){
          //traceAct('PileFenFille fen.container.id= ',fen.container.id);
          //traceAct('PileFenFille fen.typeContainer= ',fen.typeContainer);
        this.ctrlParent = fen.container.container.ctrlFenFi;
          //traceAct('PileFenFille ctrlParent= ',fen.container.container.ctrlFenFi);
        this.zIndexBase =  this.ctrlParent.zIndexBase + 1;
     }
     else{
        this.ctrlParent = "";
          //traceAct('PileFenFille typeCont!=CadreFenetre ->ctrlParent=null ');
          //traceAct('fen.container= ',fen.container);
//        if (fen.container.containerHtml.currentStyle.zIndex)
        if (getComputStyle(fen.container.containerHtml,'zIndex'))
//          this.zIndexBase = fen.container.containerHtml.currentStyle.zIndex;
          this.zIndexBase = getComputStyle(fen.container.containerHtml,'zIndex');
        else
          this.zIndexBase =  __baseZIndexFenetres;
     }
     this.eltManager      = fen.container;
     this.typeEltManager  = fen.typeContainer;

     this.managementMode  = 'win';
     this.tabsPane        = null;
     this.heightTabs      = 0;
     this.supportTabs     = null;
     // a revoir: pourquoi le controleur supporte t il la boite ? onglets ? i faudrait ajouter des fct? au supportTabs

//     this.zIndexBase = __zIndex++;
//traceAct("__zIndex= ",this.zIndexBase);

     //traceAct('a la cr?ation pile.lg= ',this.length());
     //traceAct('a la cr?ation pile.t= ',this.t);

this.base = Pile;
this.base();
}

PileFenFille.prototype = new Pile;

PileFenFille.prototype.setManagtMode = function (mode, supportTabs){
//----------------------------------
//traceAct('setModeManagt','this.managementMode= ',this.managementMode);
//traceAct('setModeManagt',' mode= ',mode);
  if (this.managementMode == mode) return;

//  if (this.typeEltManager == 'CadreFenetre'){

    var doct = this.bottom();
    // 1 elt dans le container
    if (doct){
      this.managementMode = mode;

      // pr?sentation par onglets
      if (   (mode == 'sheet')
          && (this.eltManager.bOptMSheetMode)) {

        this.eltManager.managementMode = 'sheet';

        // cr?ation d'une zone pour les onglets'
        this.tabsPane = new TabsPane(this);
        // arrimage  de la zone
        this.supportTabs = (supportTabs || this.eltManager);
        this.supportTabs.addTabsPane(this.tabsPane);

//        this.heightTabs = this.tabsPane.html.currentStyle.height;
        this.heightTabs = getComputSTyle(this.tabsPane.html,'height');

        //ajout des onglets + modification de l apparence des elts g?r?s
        while (doct){
           this.tabsPane.addTab(doct);
           doct.changeDisplayMode(mode);
           doct = this.next();
        }
        // selection d un onglet
        this.tabsPane.selectTab(this.top());
      }

      // pr?sentation par fenetres
      else if (mode == 'win'){

        this.eltManager.managementMode = 'win';

        //modification de l apparence des elts g?r?s
        while (doct){
           doct.changeDisplayMode(mode);
           doct = this.next();
        }

        // suppression de la zone d onglet
        this.supportTabs.delTabsPane();
        this.heightTabs = 0;
        this.tabsPane = null;

      }
    }
  //}
}

PileFenFille.prototype.baseRemove = Pile.prototype.remove;
PileFenFille.prototype.remove = function (elt){
//---------------------------
//traceAct('remove ',this.id);
traceExec('remove entree fen= '+ elt.titreFenetre,32);

if (this.managementMode  == 'sheet'){
   this.tabsPane.removeTab(elt);

   var nbFilleRest = this.baseRemove(elt);
   var top;
   if (top = this.top())
     this.tabsPane.selectTab(top);  // a revoir entraine un onFocus sur 1 elt deja en 1ere position
   else  // plus d'onglet -> supp barre
{//traceAct('supportTabs.id=',this.supportTabs.id);
      this.supportTabs.delTabsPane();}
   return nbFilleRest;
}
else {
//   this.onClose(elt);
   var nbEltRestants;
   if (this.length() == 1) {
     traceExec('remove une seule fen ->focusOn()',32);
     this.focusOn();
     nbEltsRestants =  this.baseRemove(elt);
   }
   else{
     traceExec('remove plus d une fen ->baseRemove(elt) ',32);
     nbEltsRestants =  this.baseRemove(elt);
     traceExec(' nbEltsRestants = '+nbEltsRestants,32);
//     traceExec('remove plus d une fen ->focusOn(this.top())',32);
//     this.focusOn(this.top());
   }
   return nbEltsRestants;
}
}
/*
//=======================================
PileFenFille.prototype.onClose = function (fen){
//=======================================
// noeud terminal
//---------------
if ( ! fen.ctrlFenFi)
    fen.onClose();
}

// noeud interm?diaire
//--------------------
else{
  fen = fen.ctrlFenFi.top();
  while (fen){
    this.onClose(fen);
    fen = fen.next();
  }

}
*/
PileFenFille.prototype.focusOn = function (fen){
//---------------------------
// focusOn()   :  limit? ? la d?sactivation de la fenetre top
  if (!fen){
      if  (this.length() > 0) {
        traceExec('focusOn() entree ->top().display("inactive")',32);
//pour test         this.top().chgEtat('inactive');
        this.modEtatFenTopEtDesc('inactive');
     }
     return;
  }
  else
    traceExec('focusOn entree fen= '+fen.titreFenetre,32);

  if (fen.active) {
    traceExec('focusOn fen deja active --> 0',32);
    return;
  }

  this.activeFenEtAsc(fen);
//  this.modEtatFenTopEtDesc('active');      // semble modifier 2 fois la fenetre fen en mode actif a revoir
//alert('appel de modEtatFenDesc');
  this.modEtatFenDesc('active');      // semble modifier 2 fois la fenetre fen en mode actif a revoir

  if (this.managementMode == 'sheet'){
      // pas de zone d onglets (supprim?e avec la derni?re feuille)
      if (!this.supportTabs.barreOnglets){
        // cr?ation d'une zone pour les onglets'
        this.tabsPane = new TabsPane(this);
        // arrimage  de la zone
//        this.supportTabs = (supportTabs || this.eltManager);
        this.supportTabs.addTabsPane(this.tabsPane);

//        this.heightTabs = this.tabsPane.html.currentStyle.height;
        this.heightTabs = getComputStyle(this.tabsPane.html,'height');
      }
      this.tabsPane.selectTab(fen);
  }
}

PileFenFille.prototype.activeFenEtAsc = function (fen){
//----------------------------------
traceExec('activeFenEtAsc'+this.id,25);
  if (fen.active) return;

  var fenActiveAnt = this.top();

  if (   (fenActiveAnt)
      && (fenActiveAnt != fen)
      && (fenActiveAnt.active)){
traceExec('desactive fen cour et descendants',44)
  traceExec('-> fenActiveAnt.chgEtat(inactive) fen= '+fenActiveAnt.titreFenetre,25);
    fenActiveAnt.chgEtat('inactive');
    traceExec('-> modEtatFenTopEtDesc',25);
    this.modEtatFenTopEtDesc('inactive');    // remodifie 1 2ieme fois en inactif fenActiveAnt a revoir
  }
// point 1
//traceAct('this.ctrlParent ',this.ctrlParent);
  if (this.ctrlParent)      {
     traceExec('activeFenEtAsc recurs',44)
     this.ctrlParent.activeFenEtAsc(fen.container);
  }
// ce code figurait ant?rieurement avant le point 1  : ? ?prouver
traceExec('fen onTop + chgt etat '+fen.titreFenetre,44);
  traceExec('-> fen.chgEtat(active) fen= '+fen.titreFenetre,25);
//  fen.chgEtat('active');
  this.onTop(fen);
// deplacer en amont pour test  traceExec('-> fen.chgEtat(active) fen= '+fen.titreFenetre,25);
  fen.chgEtat('active');

}

PileFenFille.prototype.modEtatFenTopEtDesc = function (nvEtat){
//---------------------------------------
traceExec('modEtatFenTopEtDesc '+this.id+' '+nvEtat,25);
  var fen = this.top();
  if (!fen) return;

  traceExec('-> fen.chgEtat('+nvEtat+') fen= '+fen.titreFenetre,25);
  fen.chgEtat(nvEtat);

  var ctrlDesc = fen.ctrlFenFi;
  if (ctrlDesc)
    ctrlDesc.modEtatFenTopEtDesc(nvEtat);
}

PileFenFille.prototype.modEtatFenDesc = function (nvEtat){
//---------------------------------------
traceExec('modEtatFenTopEtDesc '+this.id+' '+nvEtat,25);
  var fen = this.top();
  if (!fen) return;

  var ctrlDesc = fen.ctrlFenFi;
  if (ctrlDesc)
    ctrlDesc.modEtatFenTopEtDesc(nvEtat);
}

PileFenFille.prototype.basePush = Pile.prototype.push;
PileFenFille.prototype.push = function (elt){
//-------------------------
   this.basePush(elt);
   this.fixeZIndex(this.length());
}

PileFenFille.prototype.display = function (comportement){
//-----------------------------
//     var tTmp = this.t.slice(0,this.t.length);
     var disp = "";
     for (var i=0; i<this.t.length; i++){
          if ((i+1) == this.indCourant)
              disp = disp + '<';

//          var ob = tTmp.shift();
          var ob = this.t[i];
          if (ob.id){
              disp = disp + "\n"+i+' '+ob.id;
              disp = disp + '('+ ob.cadreExterne.style.zIndex +')';
          }
          else
              disp = disp + "\n" +i+' '+'id inconnu';

          if ((i+1) == this.indCourant)
              disp = disp + '>';
     }
     if (comportement == 'enRetour')
         return disp;
     else
          traceExec('Contenu de la pile ('+this.t.length+' elts):\n'+disp,44);
}

PileFenFille.prototype.basePop = Pile.prototype.pop;
PileFenFille.prototype.pop = function (){
//--------------------------
this.basePop();
if (this.length() > 0)
    this.focusOn(this.top());

else
  traceExec('pas d autre fenetre ds le container -> pas de focusOn -> pas d activation -> pas de abandonModePP..',44) ;
}

PileFenFille.prototype.baseOnTop = Pile.prototype.onTop;
PileFenFille.prototype.onTop = function (eltPromu){
//--------------------------
//traceAct('onTopFF',' entree ');
//traceAct('onTopFF',' eltPromu.id= ',eltPromu.id);

if (this.curseurSur(eltPromu))        // positionne indCourant sur l'elt ou nvlle place au top
{
   //traceAct('onTopFF',' elt pr?existant (-> onTop)');
   this.baseOnTop(eltPromu);    // fait passer l'elt au sommet
}
else
{   //traceAct('onTopFF',' nvl elt (-> push)');
   this.push(eltPromu);
}
this.reZIndexVersTop();             // r?indexe depuis curseur jusqu'au sommet / position des elts

//var etat = this.display('enRetour');
////traceAct('onTopFF',' etat pile = ',etat)
////traceAct('onTopFF',' sortie ');
}

PileFenFille.prototype.focusNext= function (){
//--------------------------
traceExec('foxusNext entree ->focusOn(this.next())',32);
traceExec('focusNext fen curr = '+this.top().titreFenetre,32);
var n = this.next(true);
//traceExec('focusNext fen next = '+ n ?  n.titreFenetre:'pas de next',32);
//alert('focusNext fen= '+this.titreFenetre);
//alert('focusNext ' + this.top().titreFenetre);

this.focusOn(n);     // next(true) avanc?e circulaire sauf si 1 seul elt sur pile
//this.focusOn(this.next(true));     // next(true) avanc?e circulaire sauf si 1 seul elt sur pile

//alert('focusNext ' + this.top().titreFenetre);
//if (this.length() > 0)
//    this.focusOn(this.top());
traceExec('foxusNext sortie',32);
}

PileFenFille.prototype.reZIndexVersTop = function (){
//------------------------------------
//traceAct('reZIndexVersTop',' entree');
//traceAct('reZIndexVersTop',' indCourant= ',this.indCourant);
this.fixeZIndex();
while (this.next())
      this.fixeZIndex();
//traceAct('reZIndexVersTop',' sortie');
}

PileFenFille.prototype.fixeZIndex = function (ind){
//-----------------------------------------
//traceAct('fixeZIndex ',' entree');
//traceAct('fixeZIndex ',' ind= ',ind);
  if (ind)
        ind--;
  else
        ind = this.indCourant;

  this.t[ind].cadreExterne.style.zIndex =
        this.zIndexBase + ind + 1;
//traceAct('fixeZIndex ',' zIndex= ',this.t[ind].cadreExterne.style.zIndex);
//traceAct('fixeZIndex ',' sortie');
}

PileFenFille.prototype.nbInstance = 0;